#ifndef CLIENT_WRAPPER_H
#define CLIENT_WRAPPER_H

#include <QObject>
#include <QString>
#include <QList>
#include "sfts_client_api.h"
#include "gui_bridge.h"

/**
 * @brief 客户端API包装类，为Qt GUI提供友好的接口
 *
 * 该类将C语言的sfts_client_api接口封装为Qt友好的类
 */
class ClientWrapper : public QObject
{
    Q_OBJECT

public:
    explicit ClientWrapper(QObject *parent = nullptr);
    ~ClientWrapper();

    // 连接服务器
    bool connectToServer(const QString &serverIP, int serverPort);

    // 登录
    bool login(const QString &username, const QString &password);

    // 注册用户
    bool registerUser(const QString &username, const QString &password);

    // 获取文件列表
    bool requestFileList(const QString &path = ".");

    // 上传文件
    bool uploadFile(const QString &localPath, const QString &remotePath);

    // 下载文件
    bool downloadFile(const QString &remotePath, const QString &localPath);

    // 删除文件
    bool deleteFile(const QString &remotePath);

    // 取消传输
    bool cancelTransfer();

    // 改变目录
    bool changeDirectory(const QString &directoryPath);

    // 退出登录
    bool logout();

    // 判断是否已连接
    bool isConnected() const { return m_connected; }

signals:
    // 登录结果信号
    void loginResult(bool success, const QString &message);

    // 注册结果信号
    void registerResult(bool success, const QString &message);

    // 文件列表更新信号
    void fileListUpdated(const QList<FileItem> &files);

    // 日志消息信号
    void logMessage(const QString &message, bool isError);

    // 传输进度信号
    void transferProgress(const QString &filename, int percentage, const QString &status);

    // 传输完成信号
    void transferCompleted(const QString &filename, bool success, const QString &message);

    // 连接状态变更信号
    void connectionStatusChanged(bool connected);

    // 删除文件结果信号
    void deleteFileResult(bool success, const QString &filename, const QString &message);

private slots:
    void handleRegistrationCallback(bool success, const QString &message);
    void handleDeleteFileResultCallback(bool success, const QString &filename, const QString &message);
    void onLoginResponse(bool success, const QString &messageOrUsername);

private:
    bool m_connected;
    QString m_serverIP;
    int m_serverPort;
    bool m_isLoggedIn;
    QString m_currentUser;
};

#endif // CLIENT_WRAPPER_H